package com.mycom.core1;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author xp
 *         Created on 2018/2/26
 */
public class TcpServerHandler extends SimpleChannelInboundHandler {
    private static final Logger log = LoggerFactory.getLogger(TcpServerHandler.class);

    /**
     * 简而言之就是从通道中读取数据，也就是服务端接收客户端发来的数据
     * 但是这个数据在不进行解码时它是ByteBuf类型的后面例子我们在介绍
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
        // todo 业务类信息接收
        log.info(ctx.channel().remoteAddress()+"->Server :" + msg.toString());
        ctx.channel().writeAndFlush("server write msg:" + msg + "【这里是服务器回传的消息】");
    }

    /**
     * channelActive
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelActive();
    }

    /**
     * channelInactive
     *
     * channel 	通道
     * Inactive 不活跃的
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.debug("=======服务器链接关闭=======");
        ctx.fireChannelInactive();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.debug("tcpServer:" + ctx.channel().remoteAddress() + "服务器异常");
        ctx.close();
    }


}
